package br.unisul.redeNeural;


/**
 * Classe responsavel por fazer o calculo da saida de um determinado Neuronio<p>
 * O calculo é feito da seguinte forma:<br>
 * <code>
 * ->Verifica se a quantidade de neurionios é equivalente ao de pesos.<br>
 * ->É somado os valores de cada neuronio multiplicado pelo peso<br>
 * ->Verifica se o neuronio responsavel possui um vies valido, caso ele possua o valor deste neuronio é adicionado ao somatorio;<br>
 * ->Então é setado o valor do neuronio responsavel com o valor do calculo e retorna o valor do calculo;
 * </code>
 * @author Joelson Fernandes
 *
 */
public class DefaultCalculoSaida implements CalculoSaida, java.io.Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 8313141084881681225L;

	/**
	 * O calculo é feito da seguinte forma:<br>
	 * <code>
	 * ->Verifica se a quantidade de neurionios é equivalente ao de pesos. Caso não seja equivalente o metodo retorna {@link Integer}.MIN_VALUE<br>
	 * ->É somado os valores de cada neuronio multiplicado pelo peso<br>
	 * ->Verifica se o neuronio responsavel possui um vies valido, caso ele possua o valor deste neuronio é adicionado ao somatorio;<br>
	 * ->Então é setado o valor do neuronio responsavel com o valor do calculo e retorna o valor do calculo;<br>
	 * ->Neste metodo não aplicamos a {@link FuncaoAtivacao}
	 * </code>
	 * 
	 * @param entradas - {@link Neuronio} de entrada
	 * @param pesos - {@link Peso} que estão ligados ao {@link Neuronio}
	 * @param responsalvel - {@link Neuronio} na qual recebe valor do calculo de saida 
	 * @return valor da saida 
	 * 
	 */
	public double calcularSaidaNeuronio(Neuronio[] entradas, Peso[] pesos,
			Neuronio responsalvel) {
		if(entradas.length == pesos.length){
			double d = 0;
			for (int i = 0; i < pesos.length; i++) {
				d += entradas[i].getValorNeuronio() * pesos[i].getValor();
			}
			Vies v = responsalvel.getVies();
			if(v != null){
				d+= v.getValor();
			}
			responsalvel.setValorNeuronio(d);
			return d;
		}
		return Integer.MIN_VALUE;
	}

}
